import bpy

from 节点.全局控制.Node.数据编辑.物体 import bl_修改器公共选项

import 节点.全局控制.Node.节点和插座基类.bl_节点基类 as 基类

import engine.initLIB.load_dll as engineLib
import ctypes






engineLib.flexCAPI.f_创建置物体朝向修改器节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建朝向参数节点.restype = ctypes.c_bool





def f_update_修改器打开(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	if len(修改对象) <= 0 : return False
	
	for obj in 修改对象:
		修改器 = bl_修改器公共选项.f_取约束修改器(self, obj, 'TRANSFORM')
		if 修改器 != None :
			修改器.mute = self.m_是否打开



class C_Node_置物体朝向修改器(基类.C_Node_基类):
	bl_dname = 'bl_node_置物体朝向修改器'
	bl_label = '置物体朝向'
	bl_icon = 'CON_TRACKTO'
	
	m_修改器名称 = bpy.props.StringProperty(name="修改器名称", default='Solidify')
	m_是否编辑模式显示 = bpy.props.BoolProperty()
	
	def init(self, context):
		super(C_Node_置物体朝向修改器, self).f_init(context)
		self.inputs.new('C_Socket_物体_Array1D', name='修改对象')
		self.inputs.new('C_NodeSocket_动态插座', name='朝向参数')
		self.f_toCPP(self.id_data)

	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建置物体朝向修改器节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_Bl修改器节点颜色

	def f_update(self):
		修改对象 = self.inputs['修改对象'].f_getData()
		对象数量 = len(修改对象)
		if 对象数量 <= 0 : return False
		
		if self.inputs['朝向参数'].is_linked == False : return

		朝向参数 = engineLib.flexCAPI.f_取节点数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name));
		target独立		= len( 朝向参数[0]) >= 对象数量
		track_axis独立	= len( 朝向参数[1]) >= 对象数量
		up_axis独立		= len( 朝向参数[2]) >= 对象数量
		use_track_z独立	= len( 朝向参数[3]) >= 对象数量
		influence独立	= len( 朝向参数[4]) >= 对象数量

		target		= 朝向参数[0]
		track_axis	= 朝向参数[1]
		up_axis		= 朝向参数[2]
		use_track_z	= 朝向参数[3]
		influence	= 朝向参数[4]
		print('朝向参数 = ', 朝向参数)
		index = 0
		for obj in 修改对象:
			修改器ID = obj.constraints.find(self.m_修改器名称)
			if 修改器ID >= 0 :
				修改器 = obj.constraints[修改器ID]
			else:
				修改器 = obj.constraints.new('TRACK_TO')
				self.m_修改器名称 = 修改器.name

			
			if target独立 :
				修改器.target = target[index]
			elif target:
				修改器.target = target[0]

			if track_axis独立 :
				修改器.track_axis = track_axis[index]
			elif track_axis:
				修改器.track_axis = track_axis[0]

			if up_axis独立 :
				修改器.up_axis = up_axis[index]
			elif up_axis:
				修改器.up_axis = up_axis[0]

			if use_track_z独立 :
				修改器.use_track_z = use_track_z[index]
			elif use_track_z:
				修改器.use_track_z = use_track_z[0]

			if influence独立 :
				修改器.influence = influence[index]
			elif influence:
				修改器.influence = influence[0]


			#修改器.target		= 参数[0]
			#修改器.track_axis	= 参数[1]
			#修改器.up_axis		= 参数[2]
			#修改器.use_track_z	= 参数[3]
			#修改器.influence	= 参数[4]
			index += 1


class C_NODE_MENU_置物体朝向修改器(bpy.types.Operator):
	bl_idname = 'node.global_node_obj_set_constraints_track_to'
	bl_label = '置物体朝向'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_置物体朝向修改器', use_transform=True)
		return {'FINISHED'}













class C_Node_物体朝向参数(基类.C_Node_基类):
	bl_dname = 'bl_node_物体朝向参数'
	bl_label = '物体朝向参数'
	bl_icon = 'CON_TRACKTO'
	
	def init(self, context):
		super(C_Node_物体朝向参数, self).f_init(context)
		self.inputs.new('C_Socket_物体_Array1D', name='目标物体')
		self.inputs.new('C_Socket_I8_Array1D', name='轴向')
		self.inputs.new('C_Socket_I8_Array1D', name='上方向')
		self.inputs.new('C_Socket_I8_Array1D', name='目标Z轴')
		self.inputs.new('C_Socket_F32_Array1D', name='影响系数')

		self.outputs.new('C_NodeSocket_动态插座', name='朝向参数')
		self.f_toCPP(self.id_data)
		
	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建朝向参数节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.inputs['影响系数'].f_setData(1.0)



class C_NODE_MENU_物体朝向参数(bpy.types.Operator):
	bl_idname = 'node.global_node_obj_parameter_track_to'
	bl_label = '物体朝向参数'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_物体朝向参数', use_transform=True)
		return {'FINISHED'}





classes = (
	C_Node_置物体朝向修改器,
	C_NODE_MENU_置物体朝向修改器,
	
	C_Node_物体朝向参数,
	C_NODE_MENU_物体朝向参数,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)





